<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型工厂封装继承</title>
</head>
<body>
    <script>
         // 在父类中构造初始值
         function User(name,age){
            this.name = name;
            this.age = age;
        }
        User.prototype.show = function(){
            console.log(this.name,this.age)
        }


        // 重复代码太多
        // function Admin(name,age){
        //     // 在子类中调用父类的初始值
        //     User.call(this,name,age);
        // }
        // Admin.prototype = Object.create(User.prototype);
        // Object.defineProperty(Admin.prototype,'constructor',{
        //     value:Admin,
        //     enumerable:false
        // });        
        // let admin = new Admin('xiasnn',18);
        // admin.show();


        // function Member(...args){
        //     // 在子类中调用父类的初始值
        //     User.apply(this,args);
        // }
        // Member.prototype = Object.create(User.prototype);
        // Object.defineProperty(Member.prototype,'constructor',{
        //     value:Member,
        //     enumerable:false
        // });
        // let member = new Member('xiaxia',19);
        // member.show();



        
        // 原型工厂封装
        // sub子类，sup父类
        function extend(sub,sup){
            sub.prototype = Object.create(sup.prototype);
            Object.defineProperty(sub.prototype,'constructor',{
                value:sub,
                enumerable:false
            });  
        }

        function Admin(name,age){
            // 在子类中调用父类的初始值
            User.call(this,name,age);
        }
        extend(Admin,User); 
        let admin = new Admin('xiasnn',18);
        admin.show();

        function Member(name,age){
            // 在子类中调用父类的初始值
            User.call(this,name,age);
        }
        extend(Member,User); 
        let member = new Member('xiaxia',19);
        member.show();
    </script>
</body>
</html>